package edu.del.teamknowledgebase.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * Spring Session 配置
 * 使用 Redis 存储 HttpSession，实现服务器重启后 Session 不丢失
 */
@Configuration
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 604800) // 7天
public class SessionConfig {

    /**
     * 配置 Session 序列化器
     * 使用 JSON 格式存储，并支持 Java 8 时间类型和类型信息保存
     */
    @Bean
    public RedisSerializer<Object> springSessionDefaultRedisSerializer() {
        // 创建 ObjectMapper 并注册 JavaTimeModule
        ObjectMapper objectMapper = new ObjectMapper();

        // 注册 Java 8 时间模块
        objectMapper.registerModule(new JavaTimeModule());

        // 禁用将日期写为时间戳的功能
        objectMapper.disable(com.fasterxml.jackson.databind.SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);

        // 启用默认类型信息（解决 LinkedHashMap 转换问题）
        // 创建类型验证器，允许所有类型
        BasicPolymorphicTypeValidator typeValidator = BasicPolymorphicTypeValidator.builder()
                .allowIfBaseType(Object.class)
                .build();

        // 启用类型信息，使用 NON_FINAL 模式（为非 final 类添加类型信息）
        objectMapper.activateDefaultTyping(
                typeValidator,
                ObjectMapper.DefaultTyping.NON_FINAL,
                com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY
        );

        // 使用配置好的 ObjectMapper 创建序列化器
        return new GenericJackson2JsonRedisSerializer(objectMapper);
    }
}
